const fp = require('lodash/fp') 
// IO Monad 
class IO { 
    static of (x) { 
        return new IO(function () { 
            return x 
        }) 
    }
    constructor (fn) { 
        this._value = fn 
    }
    map (fn) { 
        return new IO(fp.flowRight(fn, this._value)) 
    }
    join () { 
        return this._value() 
    }
    flatMap (fn) { 
        return this.map(fn).join() 
    } 
}
let r = readFile('package.json')
             .map(fp.toUpper) 
             .flatMap(print) 
             .join()